From: popcornmix Date: Tue, 2 May 2017 15:36:05 +0000 (+0100) Subject: vcsm: Treat EBUSY as success rather than SIGBUS X-Git-Tag: archive/raspbian/4.9.80-2+rpi1~5^2~229 X-Git-Url: https://dgit.raspbian.org/%22http://www.example.com/cgi/success/%22http:/www.example.com/cgi/success?a=commitdiff_plain;h=54c4b04474a1a71cf36d8de7d0cb86c0e3ce40fd;p=linux-4.9.git vcsm: Treat EBUSY as success rather than SIGBUS Currently if two cores access the same page concurrently one will return VM_FAULT_NOPAGE and the other VM_FAULT_SIGBUS crashing the user code. Also report when mapping fails. Signed-off-by: popcornmix --- diff --git a/drivers/char/broadcom/vc_sm/vmcs_sm.c b/drivers/char/broadcom/vc_sm/vmcs_sm.c index 1db6716c2c0c..ee4e05948c43 100644 --- a/drivers/char/broadcom/vc_sm/vmcs_sm.c +++ b/drivers/char/broadcom/vc_sm/vmcs_sm.c @@ -1181,11 +1181,20 @@ static int vcsm_vma_fault(struct vm_area_struct *vma, struct vm_fault *vmf) switch (ret) { case 0: case -ERESTARTSYS: + /* + * EBUSY is ok: this just means that another thread + * already did the job. + */ + case -EBUSY: return VM_FAULT_NOPAGE; case -ENOMEM: case -EAGAIN: + pr_err("[%s]: failed to map page pfn:%lx virt:%lx ret:%d\n", __func__, + pfn, (unsigned long)vmf->virtual_address, ret); return VM_FAULT_OOM; default: + pr_err("[%s]: failed to map page pfn:%lx virt:%lx ret:%d\n", __func__, + pfn, (unsigned long)vmf->virtual_address, ret); return VM_FAULT_SIGBUS; } }